home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / ttl_anom.nasl < prev    next >
Text File  |  2005-01-14  |  5KB  |  191 lines

  1. #
  2. # (C) Tenable Network Security
  3. #
  4. if(description)
  5. {
  6.   script_id(11858);
  7. # script_cve_id("CVE-MAP-NOMATCH");
  8.   script_version("$Revision: 1.4 $");
  9.   script_name(english:"TTL Anomaly detection");
  10.   script_description(english:"
  11. The remote host, when queried on open ports, replies with differing TTL values.  This could be an 
  12. indicator that a transparent proxy is on the way, or that this host is a forwarding router, 
  13. honeypot, etc...
  14.  
  15. An attacker may use this information to find critical systems on your network 
  16. Solution: Contact vendor for information on closing up this information leak. 
  17.  
  18. Risk factor : Low");
  19.   script_summary(english:"Check for TTL anomalies on the remote host");
  20.   script_category(ACT_GATHER_INFO);
  21.   script_family(english:"General");
  22.   script_copyright(english:"This script is (C) 2003 Tenable Network Security");
  23.   exit(0);
  24. }
  25.  
  26.  
  27.  
  28. #
  29. # The script code starts here
  30.  
  31. dstaddr=get_host_ip();
  32. srcaddr=this_host();
  33. if(islocalhost())exit(0);
  34.  
  35. IPH = 20;
  36. IP_LEN = IPH;
  37.  
  38.  
  39. openflag = j = 0;
  40.  
  41. ports = get_kb_list("Ports/tcp/*");
  42. if(isnull(ports))exit(0);
  43.  
  44.  
  45. foreach port (keys(ports))
  46. #foreach port (ports)
  47.  {
  48.   #port = int(port - "Ports/tcp/");
  49.   if (get_port_state(port)) {
  50.     # 3 times is a charm...Let's make sure there are no initial anomalies
  51.     receivedpackets = 0;                           #increment this for each packet pcap reads back in
  52.     for (mu=0; mu < 3; mu++) {
  53.       srcport = rand() % 65535;
  54.       ip = forge_ip_packet(   ip_v : 4,
  55.                         ip_hl : 5,
  56.                         ip_tos : 0,
  57.                         ip_len : IP_LEN,
  58.                         ip_id : 0xABA,
  59.                         ip_p : IPPROTO_TCP,
  60.                         ip_ttl : 255,
  61.                         ip_off : 0,
  62.                         ip_src : srcaddr);
  63.  
  64.  
  65.       tcpip = forge_tcp_packet(    ip       : ip,
  66.                              th_sport : srcport,
  67.                              th_dport : port,
  68.                              th_flags : TH_SYN,
  69.                              th_seq   : 0xF1C,
  70.                              th_ack   : 0,
  71.                              th_x2    : 0,
  72.                              th_off   : 5,
  73.                              th_win   : 512,
  74.                              th_urp   : 0);
  75.   
  76.    
  77.       filter = string("(dst port ", srcport, " ) and (src ", dstaddr, " )" );
  78.       result = send_packet(tcpip, pcap_active:TRUE, pcap_filter:filter, pcap_timeout:1);
  79.       if (result)  {
  80.         myttl = get_ip_element(ip:result, element:"ip_ttl");
  81.         myrray[mu] = myttl;
  82.         receivedpackets++;
  83.         # display(string(myttl, "\n"));                         #remove remove remove
  84.       } 
  85.   
  86.     }   # end mu
  87.  
  88.  
  89.     if (receivedpackets == 3) { 
  90.       # if we get differing TTLs for a single port, we've got a live one..
  91.       if ( (myrray[0] != myrray[1]) || (myrray[0] != myrray[2]) ) { 
  92.         security_note(port);
  93.         exit(0);
  94.       } else {
  95.         myttlrray[j] = myttl;
  96.         portnum[j] = port;
  97.       }
  98.       j++;
  99.     }  
  100.  
  101.   } # end get_port_state(port);
  102.  
  103. }
  104.  
  105.  
  106. # now, let's loop through myttlrray array and see if we have differing values....
  107.  
  108. if (strlen(myttlrray) > 2)  {
  109.   for (i=1; myttlrray[i]; i++) {
  110.     if (myttlrray[i] != myttlrray[0]) security_note(portnum[i]);
  111.     exit(0);
  112.   }
  113. }
  114.  
  115.  
  116. exit(0);
  117.  
  118. #
  119. # We could do the same thing for UDP, but that may take too long and
  120. # may disable remote services
  121. #
  122.  
  123.  
  124. myttlrray = '';
  125.  
  126.  
  127. openflag = j = 0;
  128. while (port = scanner_get_port(openflag++)) {
  129.   if (get_udp_port_state(port)) {
  130.     receivedpackets = 0;                           
  131.     for (mu=0; mu < 3; mu++) {
  132.       srcport = rand() % 65535;
  133.       ip = forge_ip_packet(   ip_v : 4,
  134.                         ip_hl : 5,
  135.                         ip_tos : 0,
  136.                         ip_len : IP_LEN,
  137.                         ip_id : 0xABA,
  138.                         ip_p : IPPROTO_UDP,
  139.                         ip_ttl : 255,
  140.                         ip_off : 0,
  141.                         ip_src : srcaddr);
  142.  
  143.  
  144.       udpip = forge_udp_packet(    ip       : ip,
  145.                              uh_sport : srcport,
  146.                              uh_dport : port);
  147.  
  148.  
  149.       filter = string("udp and (dst port ", srcport, " ) and (src ", dstaddr, " )" );
  150.       result = send_packet(udpip, pcap_active:TRUE, pcap_filter:filter);
  151.       if (result)  {
  152.         myttl = get_ip_element(ip:result, element:"ip_ttl");
  153.         myrray[mu] = myttl;
  154.         receivedpackets++;
  155.       }
  156.  
  157.     }   # end mu
  158.  
  159.  
  160.     if (receivedpackets == 3) {
  161.       # if we get differing TTLs for a single port, we've got a live one..
  162.       if ( (myrray[0] != myrray[1]) || (myrray[0] != myrray[2]) ) {
  163.         security_note(port);
  164.         exit(0);
  165.       } else {
  166.         myttlrray[j] = myttl;
  167.         portnum[j] = port;
  168.       }
  169.       j++;
  170.     }
  171.  
  172.   } # end get_port_state(port);
  173.  
  174. }
  175.  
  176.  
  177. if (strlen(myttlrray) > 2) {
  178.   for (i=1; myttlrray[i]; i++) {
  179.     if (myttlrray[i] != myttlrray[0]) security_note(portnum[i]);
  180.     exit(0);
  181.   }
  182. }
  183.  
  184.  
  185. exit(0);
  186.   
  187.  
  188.  
  189.  
  190.  
  191.